#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>

// 信号处理函数（用户态响应中断的入口）
void interrupt_handler(int signo)
{
    if (signo == SIGINT)
    {
        std::cout << "\n捕获到键盘中断信号（SIGINT）："<< signo << " 这是硬件中断的用户态响应" << std::endl;
        std::cout << "（触发源：键盘按键Ctrl+C，对应硬件中断处理后内核发送的信号）" << std::endl;
    }
    else if (signo == SIGALRM)
    {
        std::cout << "\n捕获到定时器中断信号（SIGALRM）：" << signo << " 这是硬件中断的用户态响应" << std::endl;
        std::cout << "（触发源：CPU定时器硬件中断，内核转发为SIGALRM信号）" << std::endl;
    }
}

// 注册中断信号的处理函数
void register_interrupt_handlers()
{
    // 注册键盘中断（Ctrl+C触发，对应硬件中断后内核发送的SIGINT信号）
    signal(SIGINT, interrupt_handler);
    // 注册定时器中断（内核定时器触发，对应硬件中断后发送的SIGALRM信号）
    signal(SIGALRM, interrupt_handler);
}

// 设置定时器（触发硬件中断）
void setup_timer()
{
    struct itimerval timer;
    // 首次触发时间：3秒后
    timer.it_value.tv_sec = 3;
    timer.it_value.tv_usec = 0;
    // 后续触发间隔：5秒（这里只触发一次，所以设为0）
    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = 0;
    // 设置ITIMER_REAL类型定时器（对应硬件时钟中断）
    setitimer(ITIMER_REAL, &timer, nullptr);
    std::cout << "已设置定时器：3秒后触发硬件定时器中断" << std::endl;
}

int main()
{
    std::cout << "硬件中断响应演示程序启动" << std::endl;
    std::cout << "提示：" << std::endl;
    std::cout << "1. 按下Ctrl+C触发键盘硬件中断" << std::endl;
    std::cout << "2. 等待3秒将自动触发定时器硬件中断" << std::endl;

    // 注册中断信号的处理函数
    register_interrupt_handlers();
    // 设置定时器（触发硬件中断）
    setup_timer();

    // 主循环等待中断（模拟程序运行）
    while (true)
    {
        pause(); // 阻塞等待信号（硬件中断触发后内核会发送信号唤醒）
        std::cout << "\n------ 中断处理完成，继续等待下一次中断 ------\n"
                  << std::endl;
    }
    return 0;
}